package com.boilerCloud.dao.sys.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;

import com.boilerCloud.dao.sys.IHzlqswMenuDao;
import com.boilerCloud.dto.sys.Menu;
import com.boilerCloud.util.SQLUtil;
import com.boilerCloud.util.StringUtil;

/**
 * @类功能说明：
 * @类修改者：
 * @修改日期：
 * @修改说明：
 * @公司名称：杭州龙骞科技有限公司
 * @作者：qianfuqiang
 * @创建时间：2013-8-11 下午04:02:15
 * @版本：V1.0
 */
@Repository
public class HzlqswMenuDaoImpl implements IHzlqswMenuDao {
	@Resource
	private JdbcTemplate jdbcTemplate;
	private static final Logger log = LoggerFactory.getLogger(HzlqswMenuDaoImpl.class);

	/**
	 * @函数功能说明:根据角色编号查找用户能用的菜单地址
	 * @创建者：qianfuqiang 2013-6-28
	 * @修改者：
	 * @修改内容：
	 * @参数： @param roleID
	 * @参数： @return
	 * @参数： @throws Exception
	 * @返回： String[]
	 * @抛出异常：
	 */
	public String[] getMenuUrlByRole(int roleID) throws Exception {
		log.info("根据角色编号查找用户能用的菜单地址,角色编号=" + roleID);
		String sql = "SELECT b.MENUURL FROM lqsw_b2c_sys_role_menu a LEFT OUTER JOIN lqsw_b2c_sys_menu b ON b.ID=a.MENUID "
				+ "LEFT OUTER JOIN lqsw_b2c_sys_role c ON c.ID=a.ROLEID WHERE a.ROLEID=? AND b.PARENTID<>0";
		List<String> list = this.jdbcTemplate.queryForList(sql, String.class, new Object[] { roleID });
		if (!list.isEmpty()) {
			return (String[]) list.toArray(new String[list.size()]);
		} else {
			return null;
		}
	}

	/**
	 * @函数功能说明:获取用户左侧菜单
	 * @创建者：qianfuqiang 2013-8-11
	 * @修改者：
	 * @修改内容：
	 * @参数： @param roleID
	 * @参数： @return
	 * @参数： @throws Exception
	 * @返回： List<Menu>
	 * @抛出异常：
	 */
	public List<Menu> getLeftMenu(int roleID) throws Exception {
		List<Menu> returnMenus = new ArrayList<Menu>();
		log.info("根据角色编号查找用户左侧菜单栏,角色编号=" + roleID);
		// 先获取根目录菜单
		String sql = "SELECT b.ID,b.MENUNAME,b.MENUURL,b.URLTARGET,b.HEADIMG,b.PARENTID "
				+ " FROM lqsw_b2c_sys_menu b,lqsw_b2c_sys_role_menu a "
				+ " WHERE   b.NAVMENU=1 and a.MENUID=b.ID and a.ROLEID=? ORDER BY b.sort,b.ID";
		// b.PARENTID=0 AND
		List<Menu> firstMenus = this.jdbcTemplate.query(sql, new LeftMenuRowMapper(),roleID);
		/*// 获取子菜单
		Menu menu;
		for (int i = 0; i < firstMenus.size(); i++) {
			menu = new Menu();
			menu = firstMenus.get(i);
			sql = "SELECT b.ID,b.MENUNAME,b.MENUURL,b.URLTARGET,b.HEADIMG FROM lqsw_b2c_sys_menu b "
					+ "WHERE  b.PARENTID=? AND b.NAVMENU=1 ORDER BY b.sort,b.ID";
			List<Menu> secondMenus = new ArrayList<Menu>();
			secondMenus = this.jdbcTemplate.query(sql, new Object[] { menu.getID() }, new LeftMenuRowMapper());
			menu.setChildList(secondMenus);
			returnMenus.add(menu);
		}*/
		return firstMenus;
	}

	class LeftMenuRowMapper implements RowMapper<Menu> {
		public Menu mapRow(ResultSet rs, int rowNum) throws SQLException {
			Menu menu = new Menu();
			menu.setID(rs.getInt("ID"));
			menu.setMENUNAME(rs.getString("MENUNAME"));
			menu.setMENUURL(rs.getString("MENUURL"));
			menu.setURLTARGET(rs.getString("URLTARGET"));
			menu.setHEADIMG(rs.getString("HEADIMG"));
			menu.setPARENTID(rs.getInt("PARENTID"));
			return menu;
		}
	}

	/**
	 * @函数功能说明:获取菜单列表
	 * @创建者：qianfuqiang 2013-8-12
	 * @修改者：
	 * @修改内容：
	 * @参数： @param roleID
	 * @参数： @param offset
	 * @参数： @param length
	 * @参数： @param menu
	 * @参数： @return
	 * @参数： @throws Exception
	 * @返回： List<Menu>
	 * @抛出异常：
	 */
	public List<Menu> getMenuList(int roleID, int offset, int length, Menu menu) throws Exception {
		List<Menu> menus = new ArrayList<Menu>();
		// 获取菜单
		String sql = "SELECT b.ID,b.MENUNAME,b.MENUURL,b.URLTARGET,b.HEADIMG,b.PARENTID,b.NAVMENU,"
				+ "b.CREATETIME,b.LASTUPDATE,b.REMARK,d.MENUNAME as PARENTNAME FROM lqsw_b2c_sys_menu b  "
				+ "LEFT OUTER JOIN lqsw_b2c_sys_menu d ON d.ID=b.PARENTID WHERE  b.ID>0 ";
		List<Object> sqlParams = new ArrayList<Object>();
		if (menu.getID() > 0) {
			sql += " AND a.MENUID like ?";
			sqlParams.add("%" + menu.getID()+ "%");
		}
		if (!menu.getMENUNAME().isEmpty()) {
			sql += " AND b.MENUNAME like ?";
			sqlParams.add("%" + menu.getMENUNAME() + "%");
		}
		if (menu.getNAVMENU() > 0) {
			sql += " AND b.NAVMENU=?";
			sqlParams.add(menu.getNAVMENU());
		}
		sql += " order by ID desc ";
		//getPage_SqlServer
		sql = SQLUtil.getPageSQL(sql, offset, length, SQLUtil.DBMS_MYSQL_TYPE);
		menus = this.jdbcTemplate.query(sql, sqlParams.toArray(new Object[sqlParams.size()]), new MenuRowMapper());
		return menus;
	}

	class MenuRowMapper implements RowMapper<Menu> {
		public Menu mapRow(ResultSet rs, int rowNum) throws SQLException {
			Menu menu = new Menu();
			menu.setID(rs.getInt("ID"));
			menu.setMENUNAME(StringUtil.objToString(rs.getString("MENUNAME"), ""));
			menu.setMENUURL(StringUtil.objToString(rs.getString("MENUURL"), "无"));
			menu.setURLTARGET(StringUtil.objToString(rs.getString("URLTARGET"), "无"));
			menu.setHEADIMG(StringUtil.objToString(rs.getString("HEADIMG"), ""));
			menu.setPARENTID(rs.getInt("PARENTID"));
			menu.setNAVMENU(rs.getInt("NAVMENU"));
			menu.setCREATETIME(rs.getTimestamp("CREATETIME"));
			menu.setLASTUPDATE(rs.getTimestamp("LASTUPDATE"));
			menu.setREMARK(StringUtil.objToString(rs.getString("REMARK"), ""));
			menu.setPARENTNAME(StringUtil.objToString(rs.getString("PARENTNAME"), "根菜单"));
			return menu;
		}
	}

	/**
	 * @函数功能说明:获取菜单列表数量
	 * @创建者：qianfuqiang 2013-8-12
	 * @修改者：
	 * @修改内容：
	 * @参数： @param roleID
	 * @参数： @param menu
	 * @参数： @return
	 * @参数： @throws Exception
	 * @返回： int
	 * @抛出异常：
	 */
	public int qryMenuListSize(int roleID, Menu menu) throws Exception {
		String sql = "SELECT COUNT(1) FROM lqsw_b2c_sys_menu b  where 1=1 ";
		List<Object> sqlParams = new ArrayList<Object>();
		//sqlParams.add(roleID);
		if (menu.getID() > 0) {
			sql += " AND a.MENUID like ?";
			sqlParams.add("%" + menu.getID()+ "%");
		}
		if (!menu.getMENUNAME().isEmpty()) {
			sql += " AND b.MENUNAME like ?";
			sqlParams.add("%" + menu.getMENUNAME() + "%");
		}
		if (menu.getNAVMENU() > 0) {
			sql += " AND b.NAVMENU=?";
			sqlParams.add(menu.getNAVMENU());
		}
		return this.jdbcTemplate.queryForObject(sql, sqlParams.toArray(new Object[sqlParams.size()]),Integer.class);
	}

	/**
	 * @函数功能说明:添加菜单
	 * @创建者：qianfuqiang 2013-8-13
	 * @修改者：
	 * @修改内容：
	 * @参数： @param menu
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	public int addMenu(final Menu menu) throws Exception {
		KeyHolder keyHolder = new GeneratedKeyHolder();
		final String sql = "INSERT INTO lqsw_b2c_sys_menu(MENUNAME,PARENTID,MENUURL,URLTARGET,NAVMENU,CREATETIME,LASTUPDATE,HEADIMG) "
				+ "VALUES(?,?,?,?,?,now(),now(),?)";
		this.jdbcTemplate.update(new PreparedStatementCreator() {
			public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
				PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
				ps.setString(1, menu.getMENUNAME());
				ps.setInt(2, menu.getPARENTID());
				ps.setString(3, menu.getMENUURL());
				ps.setString(4, menu.getURLTARGET());
				ps.setInt(5, menu.getNAVMENU());
				ps.setString(6, menu.getHEADIMG());
				return ps;
			}
		}, keyHolder);
		return keyHolder.getKey().intValue();
	}

	/**
	 * @函数功能说明:删除菜单
	 * @创建者：qianfuqiang 2013-8-13
	 * @修改者：
	 * @修改内容：
	 * @参数： @param id
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	public void delMenu(int id) throws Exception {
		String sql = "DELETE FROM lqsw_b2c_sys_menu WHERE ID=?";
		this.jdbcTemplate.update(sql, new Object[] { id });
	}

	/**
	 * @函数功能说明:编辑菜单
	 * @创建者：qianfuqiang 2013-8-13
	 * @修改者：
	 * @修改内容：
	 * @参数： @param menu
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	public void updateMenu(Menu menu) throws Exception {
		String sql = "UPDATE lqsw_b2c_sys_menu SET MENUNAME=?,MENUURL=?,PARENTID=?,URLTARGET=?,NAVMENU=?,"
				+ "LASTUPDATE=now(),HEADIMG=? WHERE ID=?";
		this.jdbcTemplate.update(
				sql,
				new Object[] { menu.getMENUNAME(), menu.getMENUURL(), menu.getPARENTID(), menu.getURLTARGET(),
						menu.getNAVMENU(), menu.getHEADIMG(), menu.getID() });
	}
}
